#!/bin/bash

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 默认参数
AUTO_CONFIRM=false

# 处理命令行参数
for arg in "$@"; do
    case $arg in
        --yes|-y)
            AUTO_CONFIRM=true
            shift # 移除--yes参数
            ;;
    esac
done

# 交互确认函数
confirm() {
    local prompt="$1"
    local default="$2"
    
    # 如果设置了自动确认，则直接返回默认值
    if [ "$AUTO_CONFIRM" = true ]; then
        return $default
    fi
    
    # 否则进行交互确认
    local yn
    read -p "${prompt} (y/n) " -n 1 -r yn
    echo
    if [[ $yn =~ ^[Yy]$ ]]; then
        return 0
    else
        return 1
    fi
}

# 生成更新日志函数
generateChangelog() {
    local PREVIOUS_TAG=$(git describe --tags --abbrev=0 "${RELEASE_TAG}^" 2>/dev/null || echo "")
    local LOG_CONTENT=""
    
    if [ -z "$PREVIOUS_TAG" ]; then
        # 如果没有先前的标签，获取所有提交
        LOG_CONTENT=$(git log --pretty=format:"- %s (%h)" --no-merges)
    else
        # 获取自上个版本以来的提交记录
        LOG_CONTENT=$(git log ${PREVIOUS_TAG}..HEAD --pretty=format:"- %s (%h)" --no-merges)
    fi
    
    # 分类提交记录
    local FEATURES=$(echo "$LOG_CONTENT" | grep -i "feat\|feature\|新增" || echo "")
    local FIXES=$(echo "$LOG_CONTENT" | grep -i "fix\|修复\|bug" || echo "")
    local ENHANCEMENTS=$(echo "$LOG_CONTENT" | grep -i "enhance\|优化\|改进" || echo "")
    local OTHERS=$(echo "$LOG_CONTENT" | grep -vi "feat\|feature\|新增\|fix\|修复\|bug\|enhance\|优化\|改进" || echo "")
    
    echo "## 功能新增"
    if [ -n "$FEATURES" ]; then
        echo "$FEATURES"
    else
        echo "- 无重大功能变更"
    fi
    
    echo -e "\n## 问题修复"
    if [ -n "$FIXES" ]; then
        echo "$FIXES"
    else
        echo "- 无问题修复"
    fi
    
    echo -e "\n## 改进优化"
    if [ -n "$ENHANCEMENTS" ]; then
        echo "$ENHANCEMENTS"
    else
        echo "- 无优化改进"
    fi
    
    if [ -n "$OTHERS" ]; then
        echo -e "\n## 其他变更"
        echo "$OTHERS"
    fi
}

# 显示帮助信息
showHelp() {
    echo "用法: $0 [选项] [版本号]"
    echo "选项:"
    echo "  --help          显示此帮助信息"
    echo "  --patch         自动增加修订号 (如 0.1.0 -> 0.1.1)"
    echo "  --minor         自动增加次版本号 (如 0.1.0 -> 0.2.0)"
    echo "  --major         自动增加主版本号 (如 0.1.0 -> 1.0.0)"
    echo "  --yes, -y       自动确认所有提示 (无交互模式)"
    echo "示例:"
    echo "  $0 --patch      发布补丁版本"
    echo "  $0 --minor -y   发布次要版本并自动确认所有提示"
    echo "  $0 1.2.3        发布指定版本号"
    exit 0
}

# 获取当前版本
CURRENT_VERSION=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0")
CURRENT_VERSION=${CURRENT_VERSION#v}  # 移除v前缀

# 处理版本参数
if [ "$1" = "--help" ]; then
    showHelp
fi

# 解析当前版本
MAJOR=$(echo $CURRENT_VERSION | cut -d. -f1)
MINOR=$(echo $CURRENT_VERSION | cut -d. -f2)
PATCH=$(echo $CURRENT_VERSION | cut -d. -f3)

# 确定新版本号
if [ -z "$1" ] || [ "$1" = "--yes" ] || [ "$1" = "-y" ]; then
    if [ "$AUTO_CONFIRM" = true ]; then
        # 自动模式下默认发布补丁版本
        NEW_VERSION="${MAJOR}.${MINOR}.$((PATCH+1))"
    else
        echo -e "${YELLOW}当前版本: ${CURRENT_VERSION}${NC}"
        echo -e "${YELLOW}请选择版本更新类型:${NC}"
        echo "1) 补丁版本 ${CURRENT_VERSION} -> ${MAJOR}.${MINOR}.$((PATCH+1))"
        echo "2) 次要版本 ${CURRENT_VERSION} -> ${MAJOR}.$((MINOR+1)).0"
        echo "3) 主要版本 ${CURRENT_VERSION} -> $((MAJOR+1)).0.0"
        echo "4) 手动指定版本"
        read -p "请选择 [1-4]: " VERSION_CHOICE
        
        case $VERSION_CHOICE in
            1)
                NEW_VERSION="${MAJOR}.${MINOR}.$((PATCH+1))"
                ;;
            2)
                NEW_VERSION="${MAJOR}.$((MINOR+1)).0"
                ;;
            3)
                NEW_VERSION="$((MAJOR+1)).0.0"
                ;;
            4)
                read -p "请输入新版本号: " NEW_VERSION
                ;;
            *)
                echo -e "${RED}无效的选择，退出脚本${NC}"
                exit 1
                ;;
        esac
    fi
elif [ "$1" = "--patch" ]; then
    NEW_VERSION="${MAJOR}.${MINOR}.$((PATCH+1))"
elif [ "$1" = "--minor" ]; then
    NEW_VERSION="${MAJOR}.$((MINOR+1)).0"
elif [ "$1" = "--major" ]; then
    NEW_VERSION="$((MAJOR+1)).0.0"
else
    NEW_VERSION="$1"
fi

# 变量设置
OUTPUT_DIR="output"
GITEE_OWNER="yuwenlwl"
REPO_NAME="comsdk"
RELEASE_TAG="v${NEW_VERSION}"
RELEASE_NAME="comsdk ${NEW_VERSION}"

echo -e "${BLUE}======================================${NC}"
echo -e "${BLUE}  comsdk - 版本发布工具 ${NC}"
echo -e "${BLUE}======================================${NC}"
echo -e "${YELLOW}准备发布新版本: ${CURRENT_VERSION} -> ${NEW_VERSION}${NC}"

# 自动生成更新日志（仅供参考）
echo -e "${YELLOW}生成版本更新日志...${NC}"
mkdir -p ${OUTPUT_DIR}
cat > "${OUTPUT_DIR}/changelog.md" << EOF
# comsdk ${NEW_VERSION} 更新日志

## 版本信息
- 版本: ${NEW_VERSION}
- 发布日期: $(date +"%Y-%m-%d")

$(generateChangelog)

## 使用方法
\`\`\`bash
# 更新到此版本
go get gitee.com/yuwenlwl/comsdk@v${NEW_VERSION}
\`\`\`

## 兼容性说明
$(if [ "$VERSION_CHOICE" == "3" ] || [ "$1" == "--major" ]; then
  echo "- 警告：此为主版本更新，可能包含不兼容的API变更"
  echo "- 请查看文档了解详细的迁移指南"
else
  echo "- 此版本完全向后兼容，可以直接升级"
fi)
EOF

echo -e "${GREEN}更新日志已生成到 ${OUTPUT_DIR}/changelog.md${NC}"

# 自动模式下跳过确认
if [ "$AUTO_CONFIRM" = false ]; then
    echo -e "${YELLOW}请查看并确认更新日志，完成后按Enter继续...${NC}"
    read
fi

# 检查是否有未提交的更改
if [ -n "$(git status --porcelain)" ]; then
    echo -e "${YELLOW}检测到未提交的更改。${NC}"
    
    # 显示更改的文件
    git status --short
    
    # 询问提交信息
    COMMIT_MSG="Release ${NEW_VERSION}"
    if [ "$AUTO_CONFIRM" = false ]; then
        echo
        read -p "请输入提交信息 (默认: 'Release ${NEW_VERSION}'): " input_msg
        if [ -n "$input_msg" ]; then
            COMMIT_MSG="$input_msg"
        fi
        
        # 询问是否继续
        echo -e "${YELLOW}将使用以下提交信息提交所有更改:${NC}"
        echo -e "${BLUE}${COMMIT_MSG}${NC}"
        if ! confirm "是否继续?" 0; then
            echo -e "${RED}已取消发布流程${NC}"
            exit 1
        fi
    else
        echo -e "${YELLOW}自动提交更改，使用提交信息: ${BLUE}${COMMIT_MSG}${NC}"
    fi
    
    # 暂存和提交更改
    echo -e "${YELLOW}提交代码更改...${NC}"
    git add .
    git commit -m "${COMMIT_MSG}"
    
    # 推送到远程仓库
    echo -e "${YELLOW}推送代码到远程仓库...${NC}"
    git push origin HEAD
    if [ $? -ne 0 ]; then
        echo -e "${RED}代码推送失败${NC}"
        if [ "$AUTO_CONFIRM" = false ]; then
            if ! confirm "是否继续发布流程?" 1; then
                echo -e "${RED}已取消发布流程${NC}"
                exit 1
            fi
        else
            echo -e "${YELLOW}尝试继续发布流程...${NC}"
        fi
    fi
else
    echo -e "${GREEN}没有检测到未提交的更改。${NC}"
    
    # 询问是否需要推送最新代码
    if [ "$AUTO_CONFIRM" = false ]; then
        if confirm "是否需要推送最新代码到远程仓库?" 1; then
            echo -e "${YELLOW}推送代码到远程仓库...${NC}"
            git push origin HEAD
            if [ $? -ne 0 ]; then
                echo -e "${RED}代码推送失败${NC}"
                if ! confirm "是否继续发布流程?" 1; then
                    echo -e "${RED}已取消发布流程${NC}"
                    exit 1
                fi
            fi
        fi
    fi
fi

# 询问是否继续
if [ "$AUTO_CONFIRM" = false ]; then
    echo -e "${YELLOW}此脚本将创建Git标签 ${RELEASE_TAG} 并推送到远程仓库。${NC}"
    if ! confirm "是否继续?" 0; then
        echo -e "${RED}已取消发布流程${NC}"
        exit 1
    fi
fi

# 检查标签是否已存在
if git tag | grep -q "^${RELEASE_TAG}$"; then
    echo -e "${RED}标签 ${RELEASE_TAG} 已经存在!${NC}"
    
    if [ "$AUTO_CONFIRM" = true ]; then
        # 自动模式下直接覆盖
        echo -e "${YELLOW}自动覆盖现有标签...${NC}"
        delete_tag=true
    else
        if confirm "是否覆盖现有标签?" 1; then
            delete_tag=true
        else
            echo -e "${RED}已取消发布流程${NC}"
            exit 1
        fi
    fi
    
    if [ "$delete_tag" = true ]; then
        # 删除本地和远程标签
        echo -e "${YELLOW}删除现有标签...${NC}"
        git tag -d "${RELEASE_TAG}"
        git push origin --delete "${RELEASE_TAG}" 2>/dev/null
    fi
fi

# 创建发布版本
echo -e "${YELLOW}1. 创建Git标签 ${RELEASE_TAG}...${NC}"
git tag -a "${RELEASE_TAG}" -m "Release ${NEW_VERSION}"
if [ $? -ne 0 ]; then
    echo -e "${RED}标签创建失败${NC}"
    exit 1
fi

echo -e "${YELLOW}2. 推送标签到远程仓库...${NC}"
git push origin "${RELEASE_TAG}"
if [ $? -ne 0 ]; then
    echo -e "${RED}标签推送失败${NC}"
    exit 1
fi

echo -e "${GREEN}版本标签已成功创建并推送！${NC}"
echo -e "${GREEN}现在其他服务组件可以通过以下命令更新到新版本:${NC}"
echo -e "${BLUE}go get gitee.com/yuwenlwl/comsdk@${RELEASE_TAG}${NC}"
echo
echo -e "${YELLOW}提示：作为Go模块，发布Git标签已足够让用户使用新版本。${NC}"
echo -e "${YELLOW}      不需要在Gitee上创建发行版。${NC}" 